package org.lql.chaos.common.constant;

import lombok.AllArgsConstructor;

/**
 * @author: liangqinglong
 * @date: 2025-07-02 09:38
 * @description:
 **/
@AllArgsConstructor
public enum ErrorCode implements IErrorCode {

	/**
	 * 错误码设计原则：
	 * • 第一二位（大类）：表示错误的类型或模块。常见的错误大类包括系统错误、业务错误、网络错误、验证错误等。
	 * • 第三四位（子模块）：具体的业务场景或子模块。例如，用户模块、订单模块等。
	 * • 第五位（错误类型）：具体的错误类型，例如请求错误、数据错误、权限错误等。
	 * 设计思路：
	 * • 错误码总长度为 5 位，具体结构如下：
	 * • 第1-2位（大类）：表示错误的分类，例如：系统（01）、业务（02）、网络（03）、验证（04）等。
	 * • 第3-4位（模块/ 场景）：表示具体的业务模块或场景，例如：订单（01）、用户（02）、商品（03）等。
	 * • 第5位（错误类型）：表示错误的类型，例如：请求错误（1）、权限错误（2）、数据错误（3）等
	 */

	// 成功
	SUCCESS(10000, "操作成功"),

	// 系统错误（01）
	SYSTEM_UNKNOWN_ERROR(10001, "系统未知错误"),
	SYSTEM_TIMEOUT(10002, "系统超时"),
	SYSTEM_BUSY(10003, "系统繁忙"),

	// 业务错误（02）
	USER_NOT_FOUND(20001, "用户不存在"),
	USER_ACCOUNT_LOCKED(20002, "用户账户已锁定"),
	ORDER_NOT_FOUND(20011, "订单不存在"),
	ORDER_CANNOT_BE_MODIFIED(20012, "订单不能被修改"),

	// 网络错误（03）
	NETWORK_ERROR(30001, "网络错误"),
	SERVICE_UNAVAILABLE(30002, "服务不可用"),

	// 验证错误（04）
	VALIDATION_ERROR(40001, "请求参数验证失败"),
	INVALID_TOKEN(40002, "无效的认证令牌"),
	INVALID_INPUT(40003, "无效输入"),

	// 自定义业务错误（99）
	CUSTOM_ERROR(99001, "自定义错误");

	private final int code;

	private final String message;

	@Override
	public int getCode() {
		return this.code;
	}

	@Override
	public String getMessage() {
		return this.message;
	}
}
